﻿#include <iostream>
//条款6：若不想使用编译器自动生成的函数，就该明确拒绝

class HomeForSale
{
public:
    HomeForSale(){};//因为有了拷贝构造函数，所以编译器不会为该类生成默认构造函数
    HomeForSale fun(HomeForSale hfs)
    {
        return hfs;
    }
//防止调用拷贝构造函数，可以把拷贝构造声明为private
private:
    HomeForSale(const HomeForSale& h); //禁止拷贝构造函数
    HomeForSale& operator=(const HomeForSale& h); //禁止拷贝赋值运算符
};

class Uncopyable
{
protected:
    Uncopyable(){} //允许派生类使用默认构造函数
    ~Uncopyable(){} //允许派生类使用析构函数
private:
    Uncopyable(const Uncopyable&); //禁止拷贝构造函数
    Uncopyable& operator=(const Uncopyable&); //禁止拷贝赋值运算符
};

class HomeForSale2 : private Uncopyable //继承自Uncopyable类
{
public:
    HomeForSale2(){} //允许派生类使用默认构造函数
    ~HomeForSale2(){} //允许派生类使用析构函数
};

class HomeForSale3
{
public:
    HomeForSale3(){} //允许派生类使用默认构造函数
    ~HomeForSale3(){} //允许派生类使用析构函数
    HomeForSale3(const HomeForSale3& h) = delete;
    HomeForSale3& operator=(const HomeForSale3& h) = delete; //禁止拷贝赋值运算符
};
void item6()
{
    HomeForSale h1; //编译器会为你生成默认构造函数
    HomeForSale h2; //编译器会为你生成默认构造函数
    //h1.fun(h2); //因为形参不是引用，而拷贝构造被声明为private,所以实参将不能拷贝

    //HomeForSale h3(h1); //试图拷贝h1,应该阻止编译通过
    //h1 = h2; //试图拷贝h2,应该阻止编译通过
    //以上拷贝不应该支持，因为每栋房子都是独一无二的，不能拷贝

    //HomeForSale h4 = h1; //试图拷贝h1,应该阻止编译通过
    HomeForSale2 h3;
    //HomeForSale2 h4(h3);//试图拷贝，应该阻止

    HomeForSale3 h5;
    //HomeForSale3 h6(h5); //试图拷贝h5,应该阻止编译通过
}
